プログラミングやRPG(作るほう)が好きな人の日記
このホームページは毎日 夜11時にアクセスできなくなります。朝6時半に再開されます。
(世の中のネット依存対策として)
近所の小さなおもちゃ屋さんで「ガンダムSEEDデスティニー」の「ブレイズ・ザクファントム」を買いました。
最新の「ナラティブ・ガンダム」というのもあったんですが、私の心が動いたのはザクファントムでした。
SEED もナラティブも映像はほとんど見てませんが、プラモは買ったりします。
「ガンダムSEEDデスティニー」って「ガンダムSEED」のなんなんだろうと思って調べたら、単純に続編とのことです。どこか外伝みたいな小ぶりなイメージがあるものの、SEEDは50話放送、デスティニーも50話放送でしっかりとした続編のようです。制作期間が短かったということで、どこか小ぶりな印象があるのかもしれません。とはいえ当時はだいぶ人気だったそうです。
(Wikipedia - ガンダムSEEDデスティニー/アニメ誌での評価)
左の画像リンクをクリックすると 画像を拡大 します。
画像は著作権を気にして黒おびをいれてあります。
今年の3月から、「キャラクターモデリング造形力矯正バイブル第2版」という本を読みながら、リアルな 3DCG のモデリングを練習しています。
今日は製作中のモデルに対して、このサイト(→●)を参考にして IBL によるレンダリングを行ってみました。
IBLとは「現実世界の全方向の光情報をキャプチャした画像を光源として用いる3Dレンダリングの手法」です。(weblio辞書より)
レイトレーシングやパストレーシングが1個や2個など、人間が作った限られた光源を使って光の計算をするのに対し、IBL は写真画像に含まれる草原や空や木々などから反射される光の情報を使って光の計算を行います。そのためフォトリアルなレンダリング結果が得られる、というものです。
サイトによると、Shade3D で IBL を設定するには…
以上でレンダリングすると下図の右の図のようになる。
これも綺麗は綺麗なんですが…
|
→ → → IBLにすると… → → → |
フォトリアル! |
なお、そのままだと瞳にハイライトが入らず呪われそうな顔になってしまうので、光源を一個意図的に配置してあります。
こういうフォトリアルな画像はときどき見かけますが、どうやるんだろう?と手の届かない存在に思えていました。
しかし、インターネットのサイトさんのおかげで私も出来るようになりました。
どうもありがとうございました。
それから、皆さんの参考になるように、各3DCGモデリングソフトの IBL の対応状況を調べたので掲載しておきます。
ソフト名 | 対応状況 | ||||
---|---|---|---|---|---|
Shade3D | ver7.5以降、basic, standard, professionalいずれのグレードも対応 | ||||
Blender 2.79b |
対応している。 手順(ver2.79bの場合です。最近のver2.8以降はガラリと変わったようです) 手順の 標準の場合 の結果:
手順の Cyclesレンダーを使う場合 の結果:
(標準のほうでノイズを消す方法はあるのだろうか…?) |
||||
メタセコイア | メタセコイア自体には IBL の機能はないみたいで、連携の Renderman のほうで IBL の設定があるかもしれませんが、情報が少なくて確認できません。対応していないんじゃないかと思います。 | ||||
MAYA | 調べなくても、当然あると思う。 |
以上のとおり、皆さんにとって身近なのは Blender になるかなと思います。(不思議なインターフェース(ver2.8前)にはびっくりしますが…)
(訪問者のどんなニーズと この記事がつながるか)
タイトル画面~フィールドを歩くだけ、というRPGの試作品を作りました。
まぁ、何もできないので、面白くないとは思いますが…。
タイトル画面。雪が降っています。
雪が降っているのは、「英雄伝説3白き魔女」みたいですが…。
スタートとコンティニューの区別はありません。
どちらでも選んで Enter キーを押すと、雪が動いたまま、次の画面へ移動します。これはこのページの下のほうの 5/4(土)の記事で紹介した「動いたまま画面切り替えするプログラム」です。
操作はキーボードの ↑ ↓ ← → キーと Enter キーを使います。画面タッチには対応していません。
左の画像リンクをクリックすると JavaScript を実行 します。
すぐにフィールドの画面になります。
普通と違うのは、画面の色を「実際に自分で撮影した、草原写真、木の写真、海の写真から色を取ってきた」というところです。そのため、より現実のムードに近いのではと思います。でもちょっと暗いので明るくしたほうが良いかも。
左の画像リンクをクリックすると 画像を拡大 します。
左図はこの試作で使っているフィールドのマップです。
左上に「頭がある」と思えば、全体は「猿」に見えます。
しかし、左上と右上に「カニのハサミがある」と思えば、全体は「カニ」に見えます。
そういう、「何かに見える」という方法でマップを描くと、それなりのマップが出来上がりますよ。
たとえば、現実に、千葉県はチーバ君だし、四国はオーストラリアに見えますよね。イタリアは明らかに長靴でしょ。北海道の一部が「取っ手」みたいで握って持てそうですよね。
月にはウサギがいるし、空を流れる雲はいつも何かしら何かに見えますよね。
世の中の自然のものっていつも何かに見える、ってことを逆に考えて、マップをそれらしく作るには何かをマネて描けばどこか自然になる…というわけです。
猿の上にカニを乗せた理由は、猿だけだとほんとに猿に見えてしまうので、カニにも見える…というように一種のノイズを猿に加えて、猿であるということをぼやかす効果があります。自分で作った猿の画をじいっと見て、何か別のものに見える気がする!と思ったら、猿をある程度維持しつつ、その別のものに近づけるように手を加えていきます。私の場合はそれがカニだったんです。
なお、画面サイズはファミコンと同じサイズ(256x244)。マップサイズはドラクエのアレフガルドと同じくらいのサイズ(128x128)になっています。スーパーファミコン以上の色遣いは避けてファミコンの色遣いにしようと考えています。
.BAKファイルとか、メモ書きファイルとか、ちらかったままですが、お手元で動かせます。
(訪問者のどんなニーズと この記事がつながるか)
このホームページは23時を過ぎると配信を停止していますが、今までは日本と外国とで「時差」があると、外国で昼間でも日本で23時を過ぎていれば、配信停止になってしまいました。
しかし、このたび時差に対応し、この問題は解決しました。
(…したと思います。外国からアクセスして試したりできないので確認できません)
23時をすぎていないのにこの表示が出たら、「時差を考慮する」のボタンを押せば、正常に配信されます。
…でも、日本国内ではこの問題は起こらないかな。
朝7時ごろ、近所の海へ行ってきました。
靴を脱いで足だけ海に入ったんですが、まだ冷たくて「たまらん!」という感じでした。
(右上の写真リンク( 5/6(月) タイトルの右の小さい画像)がその写真です)
GW中は何か勉強しようということで、同 書籍を読んでいました。
3日坊主とかじゃなくて、ちゃんと10日間毎日勉強でき、本の最後まで読めました。
「何もしないで遊んでいると不安」と言って始めたGW勉強だったので、その成果をここにお知らせすることにします。
本に掲載のサンプルプログラムは全部で 41 個もありましたが、丹念に WCASL-II で入力して動きを見てきました。
そのなかで技術的に気づかされることが多くありました。
また、本の章末の練習問題が7個あり、それらは自分で考えてプログラムしました。
以下は私が作ったアセンブリプログラム7個です。(リンク先の「実行」ボタンは実行できません)
※ファイル名の日付に意味はありません。
本の最後の x86系CPU(Windowsパソコン) のアセンブリ言語は Visual Studio で入力して試せました。
入力して試せた、というのは…
一般的なプログラミング言語である C言語は Cコンパイラ で「実行形式ファイル(.exeなど)」に変換されて実行されます。下図
同じように、アセンブリ言語は アセンブラ というソフトウェアで実行形式に変換されて実行されます。下図
私は Windows 用のアセンブラというソフトウェアは持っていないので本の x86系CPU のサンプルは試せないと思っていましたが、本の記事では「C言語のインラインアセンブラ」という機能を使ってアセンブリ言語を入力し実行する、という形を取っていたのでアセンブラというソフトなしでも試すことができました。下図
また、本の最後には組込み系CPU(電子工作PICマイコン)のアセンブリ言語も載っていて、MPLAB IDE で入力してシミュレーター機で試せました。
こちらは MPLAB IDE がアセンブラを用意しているので、アセンブリ言語そのままで入力できました。
「MPLAB IDE」(エムピーラブ・アイデーイー)は電子工作などをする人たちが使っているプログラミング環境です。
こういったアセンブリ言語の勉強で電気の技術者として働けるわけではないし、プログラマーとして働けるわけでもなく、メリットがいまいち見えてきませんが、以前からコンピューターのしくみや、アセンブリ言語は気になっていたので、勉強できてよかったです。
GWにどこへも出かけない代わりに、有意義に過ごせたと言えそうです。
皆さんも まとまった休みがあったら、何かチャレンジしてみてはどうでしょうか。
(訪問者のどんなニーズと この記事がつながるか)
ゲームとかで画面から画面へ切り替わるとき、じわじわと次の画面が現れる…というのはよくある画面効果ですが、今回作成したのは、切り替わりの前後の画面が両方とも動いているのに、じわじわ画面が移り変わります。
左の画像リンクをクリックすると JavaScript を実行 します。
実行したら、画面をクリックしてください。
プログラムは大きく分けて「じわじわのスクリーントーン画像を作るための部分」(makeTones関数)と、「描画部分」(frame, frameA, frameB関数)に分けられます。
両方動きながらじわじわ描画のカラクリの部分は、frame関数です。
そのほかの関数はそんなにトリッキーなことはしていません。
Windows の Firefox, Chrome, Edge, IE と、スマートホンの Firefox, Chrome, 標準ブラウザで動作確認しました。
いくらか応用しやすいようにプログラムしてあるので、もし使いたい方がいたら自由に使ってください。
参考にしたページなど:
(訪問者のどんなニーズと この記事がつながるか)
GWに入ってから毎日、「アセンブリ言語ハンドブック 高田美樹 著」で、コンピューターの動きを勉強しています。
せっかくのGWなのにどうして勉強なんかするんだよって思う人もいると思います。
私は「契約社員で派遣で時給」ですが、同じ条件の人は今の世の中 多いと思います。
時給は「働いた分だけ給料になる」という給料計算なので、今回のGWのように10日間休みだと、土日を除外して8日分の給料がマイナスになります。
それでGWになって給料が減るというのに、いったいどこへ(遊びに)出費しに行くというのか…。
というわけで、「契約社員で派遣で時給」の人はあまり遊べないんです。
それから、今回「電子機器組み立て1級」の試験を受験しないことにしましたが、そうやって何もしないで遊んでいると、私の性格だと思いますが、ちょっと不安なんです。
「契約社員で派遣で時給」で不安定な生活を送っていて、なおかつ遊ぶ?
不安定を自ら増長している感じがして、いつでも何かしら勉強していないと、危ないんじゃないかなと思うんです。
収入が減るGW & 不安定な生活 という2つの理由で家にこもってGW勉強しています。
GW勉強として具体的に何をやっているかと言うと、「アセンブリ言語ハンドブック 高田美樹 著」で紹介されている「WCASL-II」(サイト)という仮想コンピューターを使ってコンピューターの細かい動きを日々見ています。
小中学生、高校生から見れば、アセンブラの LD, LAD, DS, DC などのニーモニックと呼ばれる命令や、FFFFといった16進数、コンピューターの模式的な回路図は、何をやっているのか全然わからない 難しげなものに見えるはずです。私も子供のころはさっぱり意味の分からない世界でした。
それに今の時代、このようなコンピューターの本質部分というのは必ずしも理解する必要はなく、JavaやC言語やC#、Pythonなど、人気の言語の質の高いライブラリを勉強してライブラリを利用すれば感じの良いソフトウェアは作れると思います。
オブジェクト指向や、Oracleデータベースなども同じで、勉強すれば感じの良いソフトウェアが作れると思います。
それなのにどうしてそれらを勉強せずに、まず最初に本質部分の勉強を選ぶのか…。
それはたぶん、安定感です。(さっきの話の「生活の安定」の話ではないです)
木に例えると、JavaやC言語やC#、Python、オブジェクト指向や、Oracleデータベースなどは、枝葉です。
それに対し、アセンブリ言語やコンピューターの回路の理解は木の幹です。
枝葉の部分をたくさん習得するのも良いんですが、木の幹の部分をあまり おろそかにすると、いざというときに木の幹の細さで倒れると思うんです。
新人のプログラマーの人とかは、たぶん、使いもしない2進数を「しっかり理解しておきなさい」と言われたことがあると思います。でも実務に入ると、2進数はあまり出てこなかったりする。そんなものよりはオブジェクト指向のほうがよっぽど出てきて、オブジェクト指向を理解していないと仕事の話についていけない…っていう場面があるんじゃないかな。お客さんに出す製品の仕様書にクラス図とかUMLとか使われてるとか。
たとえば、あるソフトの開発中、画面に表示される数値が正の数のはずなのに、なぜか負の数が表示されている。テストとして負の数を与えていないのにどうして? その答えはテストとして与えた数が大きすぎてオーバーフローを起こして、数値の2進数の左端の符号ビットに1が入り、負の数になってしまった。だからその数値は符号付きではなく、符号なしに変数を宣言しなおすことになる…。
そういう感じで2進数のしくみをよく勉強しておけば、意外な事象、「いざというとき」に力を発揮します。
本質的な部分を理解すると、そのあとに続く問題の理解が速くなります。
また、本質的な部分を理解すると、じつによく、応用が利きます。
それがつまり、地面にしっかり根を張ったような「安定」なんです。
(でも基礎や本質といった部分は勉強に時間がかかるので、なかなか勉強する時間は取りづらいです)
午前は勉強して、午後は遊んでいます。好きな音楽(ゲーム音楽やアニメソングなど)をヘッドホンで聞きながら…
などなど。GWが終わって会社で「どっか行った?」と聞かれたら、「自分のやりたいこといっぱいやってました☆」と言うつもりです。
ところで、さきほど「WCASL-II」の画面を出したところで「小中学生、高校生から見れば」という言い方をしましたが、小中学生、高校生にはアセンブラやコンピューターの回路図はとても難しいと思います。そこで、次のような話で興味だけでも持ってもらえたらと思います。
たとえば、何かのプログラミング言語の変数宣言で、「整数」の変数を宣言したとします。C言語だったら、
int a = 123;
です。この 123 って、パソコンの中でどんなふうに扱われているんでしょうね? そりゃぁ、あんた…
パソコンの中のどこにもそんなふうにアラビア数字で "123" って書いてはいないですよ=3
でも知らなければみんなそう考えるでしょう。
「コンピューターは 1 と 0 の世界」というのは わりと誰でも聞いたことがあると思います。
123 を 1 と 0 だけで表すと、
123 = 0111 1011
という2進数になります。
123 などの数値はこういう2進数でコンピューターの中で扱われているってことです。
場所はメモリというハードウェア部品の中です。
でもホントにそういう 1 と 0 の並びでメモリに入っているんでしょうかね?
見たことある?
ちょっと Microsoft Visual Studio を起動して確認してみましょう。
(※ここでは VisualStudio 2017 を使用していますが、ほかのプログラミング環境でも「メモリ」の様子を表示できる機能があれば同じことができます)
(※ VisualStudio も他のプログラミング環境も、インストールしないとパソコンの中に最初から入っていたりしません)
(※ 2019年5月現在 私が使っている「Visual Studio Express 2017 for Windows Desktop」はこのページの下のほうのこのリンクでダウンロードできます。インストールするにはたしか1時間以上時間がかかります。参考)
#include <stdio.h>
void main() {
int a = 123;
printf(a);
}
16進数なので、2進数に直すと
7b = 0111 1011
!!…これはこの記事の最初に示した 123 の2進数と同じです!
というわけで、ちゃんとメモリのなかでそういう 1 と 0 の並びになっていることが確認できました。
でも、もっと具体的にあなたのパソコンをまじまじと見て想像してほしいので、「メモリ」というハードウェアについて説明しますね。
(これってほんとに日記なのか?)
メモリの構造は、Wikipedia の「DRAM」のページに出ています。(Wikipedia - DRAM(Dynamic Random Access Memory))
▼1. パソコンの中には、こういう「メモリー」と呼ばれる基板が入っています。
▼2. そして、メモリー基板には「メモリーIC」がいくつか載っています。イラストでは4つ載っています。
▼3. メモリーICの中は、メモリの「周辺回路」と、「メモリセル集合部分」とで構成されているそうです。(Wikipedia - DRAMより)
※この図は簡略化しています。メモリセル集合部分は もっとずっと きめ細かいです。
▼4. Wikipedia によると、「1つのメモリセルで1ビットの記憶(1か0)を保持している」のだそうです。
▼5. 1つのメモリセルには1つのコンデンサ(キャパシタともいう)が入っています。
▼6. メモリセルのコンデンサに電気がある場合はビットが1、ない場合はビットが0というように扱われています。
それが実際、どういうことなのか実験動画を見てみましょう!
実験に使用した部品:
|
「コンデンサ」と「電池」と「LED」を使ってメモリー(DRAM)の実験をします。 同じコンデンサでも、見た目がもっと大きいものは、同じ実験をすると大電流で やけど します。動画のような小さいコンデンサで行ってください。よくわからない場合はマネしないでください。 読みだしの LED 点灯はごく一瞬です。 情報 "1" を書き込み 電池とコンデンサの + どうし、- どうしを合わせて充電。 情報 "1" を保持しています コンデンサに電気が貯まっています。 情報 "1" を読み込み ごく一瞬! LED とコンデンサの + どうし、- どうしを合わせて放電。
コンデンサに充電があれば1、充電がなければ0です。 情報 "0" は実験していませんが、0 の書き込みは「充電しない」ということです。 読みだしたとき LED が光らなければ「充電がない」ので "0" を読んだことになります。
コンデンサがメモリーとして使える、ということがわかっていただけましたでしょうか。ガッテン
なお、コンデンサは充電したまま放置すると、自然と放電していくので、ときどき同じ内容を書き込みなおす(リフレッシュする)必要があります。それが Dynamic(動的)だ(DRAMのD)ということです。
|
▼7. 以上のことから「↓こんなイメージを持って良い」ということでしょう。
※この図は簡略化しています。メモリセル集合部分は もっとずっと きめ細かいです。
※「こうなっている」というのは、並びのことです。(イラストみたいに IC の中でテカテカ光っているわけではないです)
※ICの形に対して横ではなく縦に並んでいるとか、はたまた水平ではなく積層されて垂直に並んでいるとか、その辺はメモリICを設計した人に聞かないとわかりませんが、縦横にしろ垂直にしろ2進数の並ぶ順はその順になっています。私が今勉強している「アセンブリ言語ハンドブック 高田美樹 著」の P27 でもそのように説明されています。ビットデータが流れるデータバスという8本の回路のことを考えても、この辺は疑う余地はないと思います。今度運が良ければ、その辺のメモリ~データバス~CPUの電子回路の実験や話ができればと思います。
「実際、こうなっている!」と言うには、ちょっと説明が足らないと思うので、後日修正を検討しています。(2019/5/20記。2019/5/20後日修正予定)
………、というわけで、電気がちゃんと、
●●●● ●●●● という感じで、そこに存在しているということです。
※float a = 123; とかにしていると また違う並びになります。
※Windows が動作する Intel の x86 や core i5 などの CPU は「リトルエンディアン方式」なので、123 とかだったら上記説明のとおりですが、たとえば 10進数 800 は 16進数で 0320 ですが、メモリにしまわれると、リトルエンディアンなので 20 03 という2桁を単位にして逆に並べた並びになります。
ブラックボックスだったパソコンの正体がちょっと見えた感じで、少し興味がわいたんじゃないでしょうか…?
見えなかったものが見えると、自由に使いこなせる気がするものです。
(訪問者のどんなニーズと この記事がつながるか)
項目が増えてきたので縦リストではなく、アイコンにしてみました。
アイコンにしたのはトップページだけで、3DCGやRPG開発などサブメニューに入ると、以前と同じ表示です。
私が3年前くらいから育てている鉢植えです。
GW中、きれいに咲いていたので撮影しました。
左の画像リンクをクリックすると 画像を拡大 します。
ホットケーキをそのまま作って、そのまま食べてもイマイチおいしくないのは昔からで、最近食べてもやはり味気なかったです。
そこで、砂糖を少々加え、ココアパウダーを小さじ3杯ほど入れ、ピーナッツを砕いて入れて、ブラウニーみたいにして焼きました。ホントのブラウニーはチョコレートのシロップか何かをしこむんだろうか?
GW中にこうやってホットケーキとか何か特別な料理を手作りしていると、「GWらしい」気がしました。
食べてみると、まぁまぁ食べられるようになりました☆
左の画像リンクをクリックすると 画像を拡大 します。
(訪問者のどんなニーズと この記事がつながるか)
<!DOCTYPE html><!--ESCAPEPROCESS-->
<head>
<script>
function onloadx() {
//一般関数
console.log( "文字列" );
}
function Class1() {
//クラス
console.log( "文字列" );
}
Class1.prototype.method1 = function() {
//メソッド
console.log( "文字列" );
}
</script>
</head>
<body onload="onloadx();" style="">
Hello world!<BR>
</body>
</html>
<!DOCTYPE html><!--ESCAPEPROCESS-->
<head>
<script>
function onloadx() {
//一般関数
console.log( "文字列" );
}
function Class1() {
//クラス
console.log( "文字列" );
}
Class1.prototype.method1 = function() {
//メソッド
console.log( "文字列" );
}
</script>
</head>
<body onload="onloadx();" style="">
Hello world!<BR>
</body>
</html>
<!DOCTYPE html><!--ESCAPEPROCESS-->
<head>
<script>
function onloadx() {
//一般関数 コメント変更
console.log( "文字列変更" );
行追加
}
function Class1() {
//クラス コメント変更
console.log( "文字列変更" );
行追加
}
Class1.prototype.method1 = function() {
//メソッド コメント変更
console.log( "文字列変更" );
行追加
}
</script>
</head>
<body onload="onloadx();文字列変更" style="">
Hello world!<BR>
HTML追加
</body>
</html>
<!DOCTYPE html><!--ESCAPEPROCESS-->
<head>
<script>
function onloadx() {
//一般関数 コメント変更
console.log( "文字列変更" );
行追加
}
function Class1() {
//クラス コメント変更
console.log( "文字列変更" );
行追加
}
Class1.prototype.method1 = function() {
//メソッド コメント変更
console.log( "文字列変更" );
行追加
}
</script>
</head>
<body onload="onloadx();文字列変更" style="">
Hello world!<BR>
HTML追加
</body>
</html>